import java.lang.reflect.Field;
import java.security.ProtectionDomain;

public class Unsafe {
    ///--------------------- peek and poke 指令--------------
//获取对象o中给定偏移地址(offset)的值。以下相关get方法作用相同
    public native int getInt(Object o, long offset);
    //在对象o的给定偏移地址存储数值x。以下set方法作用相同
    public native void putInt(Object o, long offset, int x);
    public native Object getObject(Object o, long offset);
    public native void putObject(Object o, long offset, Object x);
//从给定内存地址获取一个byte。下同
    public native byte    getByte(long address);
    //在给定内存地址放置一个x。下同
    public native void    putByte(long address, byte x);
//获取给定内存地址的一个本地指针
    public native long getAddress(long address);
    //在给定的内存地址处存放一个本地指针x
    public native void putAddress(long address, long x);

    ///------------------内存操作----------------------
//在本地内存分配一块指定大小的新内存，内存的内容未初始化;它们通常被当做垃圾回收。
    public native long allocateMemory(long bytes);
    //重新分配给定内存地址的本地内存
    public native long reallocateMemory(long address, long bytes);
    //将给定内存块中的所有字节设置为固定值（通常是0）
    public native void setMemory(Object o, long offset, long bytes, byte value);
    //复制一块内存，double-register模型
    public native void copyMemory(Object srcBase, long srcOffset,
                                  Object destBase, long destOffset,
                                  long bytes);
    //复制一块内存，single-register模型
    public void copyMemory(long srcAddress, long destAddress, long bytes) {
        copyMemory(null, srcAddress, null, destAddress, bytes);
    }
    //释放给定地址的内存
    public native void freeMemory(long address);
    //获取给定对象的偏移地址
    public native long staticFieldOffset(Field f);
    public native long objectFieldOffset(Field f);

    //------------------数组操作---------------------------------
//获取给定数组的第一个元素的偏移地址
    public native int arrayBaseOffset(Class<?> arrayClass);
    //获取给定数组的元素增量地址，也就是说每个元素的占位数
    public native int arrayIndexScale(Class<?> arrayClass);

    //------------------------------------------------------------
//告诉虚拟机去定义一个类。默认情况下，类加载器和保护域都来自这个方法
    public native Class<?> defineClass(String name, byte[] b, int off, int len,
                                       ClassLoader loader,
                                       ProtectionDomain protectionDomain);
    //定义匿名内部类
    public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
    //定位一个实例，但不运行构造函数
    public native Object allocateInstance(Class<?> cls) throws InstantiationException;

    ///--------------------锁指令（synchronized）-------------------------------
//对象加锁
    public native void monitorEnter(Object o);
    //对象解锁
    public native void monitorExit(Object o);
    public native boolean tryMonitorEnter(Object o);
    //解除给定线程的阻塞
    public native void unpark(Object thread);
    //阻塞当前线程
    public native void park(boolean isAbsolute, long time);

    // CAS
    public final native boolean compareAndSwapObject(Object o, long offset,
                                                     Object expected,
                                                     Object x);
    //获取对象o的给定偏移地址的引用值（volatile方式）
    public native Object getObjectVolatile(Object o, long offset);
    public native void    putObjectVolatile(Object o, long offset, Object x);


//用于lazySet，适用于低延迟代码。
    public native void    putOrderedObject(Object o, long offset, Object x);
//获取并加上给定delta，返回加之前的值
    public final int getAndAddInt(Object o, long offset, int delta) {
        return 0;
    }
//为给定偏移地址设置一个新的值，返回设置之前的值
    public final int getAndSetInt(Object o, long offset, int newValue) {
        return 0;
    }

///--------------------1.8新增指令-----------------------
//LoadLoad屏障：对于这样的语句Load1; LoadLoad; Load2，在Load2及后续读取操作要读取的数据被访问前，保证Load1要读取的数据被读取完毕。
//StoreStore屏障：对于这样的语句Store1; StoreStore; Store2，在Store2及后续写入操作执行前，保证Store1的写入操作对其它处理器可见。
//LoadStore屏障：对于这样的语句Load1; LoadStore; Store2，在Store2及后续写入操作被刷出前，保证Load1要读取的数据被读取完毕。
//StoreLoad屏障：对于这样的语句Store1; StoreLoad; Load2，在Load2及后续所有读取操作执行前，保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。        在大多数处理器的实现中，这个屏障是个万能屏障，兼具其它三种内存屏障的功能。
// loadFence() 表示该方法之前的所有load操作在内存屏障之前完成
    public native void loadFence();
    //表示该方法之前的所有store操作在内存屏障之前完成
    public native void storeFence();
    //表示该方法之前的所有load、store操作在内存屏障之前完成，这个相当于上面两个的合体功能
    public native void fullFence();
}
